Problem
我是歌手
Description
年一开始,一档音乐节目“我是歌手”就惊艳了大家一回。闲话少说,现在,你成为了这档节目的总导演,你的任务很简单,安排每一期节目的内容。
现在有个歌手,种歌曲流派(,之类),每个歌手都有自己擅长的流派领域,这些资料都已整理。你的工作是,安排尽可能多场的演唱比赛。每一场比赛所有歌手都必须上场,为了提高收视率,每个人演唱的歌曲类型不能相同,即便一些歌手要被迫选择一些他们不擅长的。同时,为了展现全面性,在不同的演唱比赛上,每个歌手都会安排不同的歌曲流派。
但是问题是,对于任何一个歌曲流派的歌迷,如果超过个不擅长的歌手演唱了这种歌曲,他们就会表示不满,比如,发一些宣泄不满的帖子微博,为了表示观点挑起事端等等。你当然不希望这些事情与你的节目有关,在这个前提下,你可以任意安排尽可能多的比赛场次。
Input
输入第一行为,表示有组测试数据。
每组数据以四个数字,,,开始。表示有组擅长关系,接下来的行,每一行有两个数字,,表示歌手擅长类型的歌曲。
Output
Sample Input
1 | 3 |
Sample Output
1 | Case 1: 1 |
Explanation
1 | 对第三组样例,可以如此安排: |
Hint
相同关系不会重复出现
标签:带修主席树
Solution
挺好的一道套路建模题。
二分最多能安排的场次,得到当前答案进行判定。
首先,如果保证每个人唱每种流派最多仅一次,并且个流派均会被唱至少次,那么一定能找到一组解。这样就可以用最大流判定。
由于有“每个流派仅能有个不擅长的选手唱”,我们需要把每个流派又擅长的选手唱和不擅长的选手唱分开,而限制不擅长的选手的数量。可将每个流派拆成两个点,即第个流派拆成和。从向擅长的选手连边,从向不擅长的选手连边,而由于从源点向连有的边,因而所有可用流量都在中,的流量需要限制,故要在和间连的边来限制不擅长选手的数量。
建模总述:
建模后跑最大流,看是否有即可。
Code
1 |
|